package com.bcc.airlines.app;

import com.bcc.airlines.database.DAO;
import com.bcc.airlines.database.DAOFactory;
import com.bcc.airlines.patterns.Observado;
import com.bcc.airlines.patterns.Observador;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;


/**
 * Classe de fachada que serve de interface entre a UI e o Core do sistema
 * 
 * @author Sergio
 *
 */
public class Facade implements Observado {
    
    private List<Observador> observadores = new ArrayList<>();

    /**
     * Adiciona um elemento
     * @param a
     */
    @SuppressWarnings("unchecked")
    public <T> void add(Class classe, T a) {
        try {
            DAO<T> man = DAOFactory.<T>getDAO(classe);
            man.add(a);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        notificaObservadores();
    }
    
    
    /**
     * Atualiza um elemento
     * @param a
     */
    @SuppressWarnings("unchecked")
    public <T> void update(Class classe, T a) {
        try {
            DAO<T> man = DAOFactory.<T>getDAO(classe);
            man.up(a);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        notificaObservadores();
    }

    /**
     * Remove um elemento
     * @param a
     */
    @SuppressWarnings("unchecked")
    public <T> void remove(Class classe, T objeto) {
        try {
            DAO<T> man = DAOFactory.<T>getDAO(classe);
            man.rm(objeto);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        notificaObservadores();
    }

    /**
     * Retorna um elemento
     * @param id
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> T get(Class classe, String id) {
        try {
            DAO<T> man = DAOFactory.<T>getDAO(classe);
            return (T) man.get(id);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            return null;
        }
    }

    /**
     * Lista elementos
     * @param a
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> List<T> list(Class classe) {
        try {
            DAO<T> man = DAOFactory.<T>getDAO(classe);
            return man.list();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            return null;
        }
    }

    /**
     * Sai da aplicacao, com educacao, salvando o estado da coisa
     */
    public void quit() {
        Main.quit();
    }
    
    public void registerDatabaseObserver(Observador o) {
        registraObservador(o);
    }

    @Override
    public void notificaObservadores() {
        for(Observador o : observadores)
            o.atualiza();
    }

    @Override
    public void registraObservador(Observador o) {
        observadores.add(o);
    }

    @Override
    public void removeObservador(Observador o) {}
    
}
